package com.xsd.juc;

/**
 * @Description: Volatile关键字与内存可见性
 * @Author: zhoufuzong
 * @Created: 2021-01-10 20:23:52
 * @Version: 1.1.0
 */

import java.util.concurrent.TimeUnit;

/**
 * 一、volatile 关键字: 当多个线程操作共享数据时，可以保证内存中的数据可见
 *          相较于 synchronized 是一种较为轻量级的同步策略
*   注意：
 *      1.volatile 不具备 "互斥性"
 *      2. volatile 不能保证变量的 "原子性"
 *
 * 内存可见性问题是：当多个线程操作共享数据时，彼此不可见
 */
public class VolatileDemo {

    public static void main(String[] args) {
        ThreadDemo td = new ThreadDemo();
        new Thread(td).start();

        while (true) {

            if (td.isFlag()) {
                System.out.println("***********");
                break;
            }else {

            }
        }

    }

}

class ThreadDemo implements Runnable{
    private  volatile boolean flag = false;

    @Override
    public void run() {
        try{ TimeUnit.MILLISECONDS.sleep(200); } catch(InterruptedException e) {e.printStackTrace();}
        flag=true;
        System.out.println(Thread.currentThread().getName()+"\t"+isFlag());
    }

    public boolean isFlag() {
        return flag;
    }

    public void setFlag(boolean flag) {
        this.flag = flag;
    }
}


